import {createNamespace} from '../utils';
import {CheckboxMixin} from '../mixins/checkbox';

var _createNamespace = createNamespace('checkbox'),
    createComponent = _createNamespace[0],
    bem = _createNamespace[1];

export default createComponent({
    mixins: [CheckboxMixin({
        bem: bem,
        role: 'checkbox',
        parent: 'vanCheckbox'
    })],
    computed: {
        checked: {
            get: function get() {
                return this.parent ? this.parent.value.indexOf(this.name) !== -1 : this.value;
            },
            set: function set(val) {
                if (this.parent) {
                    this.setParentValue(val);
                } else {
                    this.$emit('input', val);
                }
            }
        }
    },
    watch: {
        value: function value(val) {
            this.$emit('change', val);
        }
    },
    methods: {
        // @exposed-api
        toggle: function toggle(checked) {
            var _this = this;

            if (checked === void 0) {
                checked = !this.checked;
            }

            // When toggle method is called multiple times at the same time,
            // only the last call is valid.
            // This is a hack for usage inside Cell.
            clearTimeout(this.toggleTask);
            this.toggleTask = setTimeout(function () {
                _this.checked = checked;
            });
        },
        setParentValue: function setParentValue(val) {
            var parent = this.parent;
            var value = parent.value.slice();

            if (val) {
                if (parent.max && value.length >= parent.max) {
                    return;
                }
                /* istanbul ignore else */


                if (value.indexOf(this.name) === -1) {
                    value.push(this.name);
                    parent.$emit('input', value);
                }
            } else {
                var index = value.indexOf(this.name);
                /* istanbul ignore else */

                if (index !== -1) {
                    value.splice(index, 1);
                    parent.$emit('input', value);
                }
            }
        }
    }
});